package lee.study.demo1;

class Animal {
    protected String name;//属性
    int a;//默认权限---》包访问权限---》只能在同一个包装进行访问

    public Animal(String name) {//构造方法
        this.name = name;
        System.out.println("Animal(String)");
        eat();
    }

    public void eat() {//实例方法
        System.out.println(this.name + "Animal:eat()");
    }
}

class Cat extends Animal {//cat继承animal类
    public int count = 999;

    public Cat(String name) {//子类在构造时，要先帮父类进行构造，且必须写在第一行
        super(name);//显示调用父类的构造方法
        System.out.println(this.name + "Cat(String)");
    }

    public void eat() {//与Animal类中的eat发生了重写。
        System.out.println(this.name + "NewAnimal.eat()");
    }
}

final class Bird extends Cat {
    public Bird(String name) {
        super(name);
    }

    public void fly() {
        System.out.println(this.name + "Animal:fly()");
    }
}

public class TestMain {

    //演示不安全的向下转型
    public static void main(String[] args) {
        Animal animal = new Cat("kiyomi");
        animal.eat();
        //A instanceof B 判断A是不是B的一个实例
        if (animal instanceof Bird) {
            Bird bird = (Bird) animal;
            bird.fly();
        } else System.out.println("wuhudasima");
    }


    public static void main3(String[] args) {
        Animal animal = new Bird("kiyomi");
        animal.eat();

        //向下转型 父类的引用赋值给了子类
        //向下转型非常不安全，很少使用
        Bird bird = (Bird) animal;
        bird.fly();
    }


    //向上转型,父类引用，引用子类对象(a.直接赋值。b.传参。c.返回值。)
    public static void func(Animal animal) {//b.传参
        animal.eat();
    }

    public static Animal func() {//c.返回值
        /*Cat cat=new Cat("OTTO");
        return cat;*/
        return new Cat("OTTO");
    }

    //运行时绑定
    //父类引用，引用子类对象，同时通过父类引用调用同名的覆盖方法，此时就会发生运行时绑定
    public static void main2(String[] args) {
        Animal animal = new Cat("Lastxuan");//a.直接赋值
        animal.eat();
        //animal.count;
        //error，向上转型之后，通过父类的引用，只能访问父类自己的方法或者属性。
        //父类引用只能访问自己特有的
    }

    public static void main1(String[] args) {
        Animal animal = new Animal("bzzb");
        Cat cat = new Cat("otto");

    }
}

